/*
        通⽤功能类模块，与业务⽆关的功能实现
        1. 获取系统时间
        2. 获取⽂件⼤⼩
        3. 创建⽬录
        4. 获取⽂件所在⽬录
*/

#ifndef __M_UTIL_H__
#define __M_UTIL_H__

#include<iostream>
#include<ctime>
#include<unistd.h>
#include<sys/stat.h>

namespace Hxy_Log
{
    namespace util
    {
        //获取系统时间
        class date
        {
            public:
            static size_t GetTime()
            {
                return (size_t)time(nullptr);
            }
        };

        class file
        {
            public:
            //判断文件是否存在
            static bool Exists(const std::string& name)
            {
                //使用access系统调用接口进行检查文件是否存在，如果文件不存在就会返回0
                //缺点：跨平台差，只能在Linux下使用，Windows并不行
                // return access(name.c_str(),F_OK) == 0;

                //使用系统接口stat进行检查文件是否存在，能够进行跨平台
                struct stat st;
                return stat(name.c_str(),&st) == 0; //存在等于0，不存在等于-1 
            }

            //获取文件目录
            static std::string Path(const std::string& pathname)
            {
                //  ./abc/abc/abc  返回./abc/abc/
                //从路径最后开始找，找到返回最后一个目录前面的路径，没找到就是在根目录，返回.
                size_t pos = pathname.find_last_of("/\\");
                if(pos == std::string::npos) return "."; 
                return pathname.substr(0,pos+1);
            }

            //创建文件目录
            static void CreateDirectory(const std::string& pathname)
            {
                // ./abc/abc/acb  -> ./ -> ./abc -> ./abc/ac -> ./abc/abc/abc
                if(pathname.size() == 0) return;
                if(Exists(pathname)) return;
                size_t pos = 0,idx = 0; //pos 记录寻找的起点，idx记录找到的位置
                while (pos < pathname.size())
                {
                    idx = pathname.find_first_of("/\\",pos);
                    if(idx == std::string::npos) mkdir(pathname.c_str(),0755);// 没找到就是在根目录.
                    if(idx == pos) {pos = idx+1;continue;}  
                    std::string tmp = pathname.substr(0,idx+1);
                    if(Exists(tmp)) {pos = idx+1;continue;} //存在跳过找下一个
                    //不存在，进行创建目录
                    mkdir(tmp.c_str(),0755);
                    pos = idx+1;
                }
            }
        };

    }
}

#endif 